package service;

import data.*;

/**
 * 游戏逻辑服务类 - 纯业务逻辑，不涉及数据和界面
 */
public class GameLogicService {
    // -------------------- service --------------------
    private GameRuntimeData runtimeData;
    private CollisionService collisionService;
    private TankService tankService;
    private BulletService bulletService;
    private EnemyAIService enemyAIService;

    public GameLogicService() {
        this.runtimeData = GameRuntimeData.getInstance();
        this.collisionService = new CollisionService();
        this.tankService = new TankService();
        this.bulletService = new BulletService();
        this.enemyAIService = new EnemyAIService();
    }

    /**
     * 功能: 开始新游戏
     * 重置游戏数据
     * 加载地图
     * 创建游戏对象
     * 参数: void
     * 返回值: void
     */
    public void startNewGame() {
        runtimeData.resetGameData();
        loadGameMap();
        runtimeData.createHero();
        runtimeData.createCamp();
        runtimeData.setGameState(1);
        runtimeData.setGameRunning(true);
    }

    /**
     * 功能: 加载游戏地图
     * 根据当前关卡加载地图数据
     * 创建方块对象
     * 参数: void
     * 返回值: void
     */
    private void loadGameMap() {
        byte[][] gameMap = GameMapData.getGameMap(runtimeData.getCurrentGrade());
        runtimeData.setEnemyTotalNum(GameMapData.getEnemyTankNum(runtimeData.getCurrentGrade()));

        runtimeData.getBlockList().clear();
        for (int i = 0; i < gameMap.length; i++) {
            for (int j = 0; j < gameMap[i].length; j++) {
                if (gameMap[i][j] == 1) {
                    runtimeData.getBlockList().add(new BlockData(1, j * 30, i * 30));
                } else if (gameMap[i][j] == 2) {
                    runtimeData.getBlockList().add(new BlockData(2, j * 30, i * 30));
                }
            }
        }
    }

    /**
     * 功能: 游戏主循环更新
     * 更新所有游戏对象状态
     * 处理碰撞检测
     * 检查游戏胜负
     * 参数: void
     * 返回值: void
     */
    public void update() {
        if (!runtimeData.isGameRunning()) return;

        // 更新子弹
        bulletService.updateAllBullets();

        // 更新敌方AI
        enemyAIService.updateAllEnemyAI();

        // 处理碰撞检测
        collisionService.checkAllCollisions();

        // 检查游戏胜负
        checkGameResult();
    }

    /**
     * 功能: 创建敌方坦克
     * 在敌方坦克池中寻找空闲坦克或创建新坦克
     * 参数: void
     * 返回值: void
     */
    public void createEnemyTank() {
        if (runtimeData.getEnemyDeadNum() >= runtimeData.getEnemyTotalNum()) {
            return; // 已达到最大敌方坦克数量
        }

        // 寻找空闲敌方坦克
        EnemyData enemy = null;
        for (EnemyData e : runtimeData.getEnemyPool()) {
            if (e.getState() == 0) {
                enemy = e;
                break;
            }
        }

        if (enemy == null && runtimeData.getEnemyPool().size() < 6) {
            // 创建新敌方坦克
            int x = Math.random() < 0.5 ? 0 : 750;
            enemy = new EnemyData(x, 0, 2);
            runtimeData.getEnemyPool().add(enemy);
        }

        if (enemy != null) {
            // 重置坦克状态
            int x = Math.random() < 0.5 ? 0 : 750;
            enemy.setX(x);
            enemy.setY(0);
            enemy.setDirection(2);
            enemy.setHp(100);
            enemy.setState(1);
        }
    }

    /**
     * 功能: 检查游戏结果
     * 检查胜利条件和失败条件
     * 参数: void
     * 返回值: void
     */
    private void checkGameResult() {
        // 检查失败条件
        if (runtimeData.getHero() != null && runtimeData.getHero().getHp() <= 0) {
            runtimeData.setGameState(3); // 游戏结束
            runtimeData.setGameRunning(false);
            return;
        }

        if (runtimeData.getCamp() != null && runtimeData.getCamp().getState() == 0) {
            runtimeData.setGameState(3); // 游戏结束
            runtimeData.setGameRunning(false);
            return;
        }

        // 检查胜利条件
        if (runtimeData.getEnemyDeadNum() >= runtimeData.getEnemyTotalNum()) {
            boolean allEnemyDead = true;
            for (EnemyData enemy : runtimeData.getEnemyPool()) {
                if (enemy.getState() == 1) {
                    allEnemyDead = false;
                    break;
                }
            }

            if (allEnemyDead) {
                // 进入下一关
                int nextGrade = runtimeData.getCurrentGrade() + 1;
                if (nextGrade <= GameMapData.getGradeCount()) {
                    runtimeData.setCurrentGrade(nextGrade);
                    startNewGame();
                } else {
                    runtimeData.setGameState(4); // 游戏胜利
                    runtimeData.setGameRunning(false);
                }
            }
        }
    }
    // -------------------- service --------------------
}